package es.uned.eped.tad.lineales;

import es.uned.eped.tad.interfaces.IteratorIF;
import es.uned.eped.tad.interfaces.StackIF;

public class StackIterator<T> implements IteratorIF<T> {
		private StackIF<T> handler;
		private StackIF<T> restart;
		
		/**
		 * Constructor para StackIterator.
		 * @param handler el manejador de pilas.
		 */
		public StackIterator (StackIF<T> handler)
		{
			this.handler = handler;
			this.restart = new StackDynamic<T> (handler);
		}
		
		/**
		 * Devuelve el siguiente elemento de la iteracion.
		 * @return el siguiente elemento de la iteracion.
		 */
		@Override
		public T getNext ()
		{
			T top = handler.getTop ();
			handler.pop ();
			return top;
		}
		
		/**
		 * Devuelve cierto si existen mas elementos a iterar.
		 * @return cierto si existen mas elementos a iterar.
		 */
		@Override
		public boolean hasNext ()
		{
			return !handler.isEmpty ();
		}
		
		/**
		 * Restablece el iterador para volver al inicio
		 */
		@Override
		public void reset ()
		{
			handler = new StackDynamic<T> (restart);
		}
		
	
	@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result
					+ ((handler == null) ? 0 : handler.hashCode());
			result = prime * result
					+ ((restart == null) ? 0 : restart.hashCode());
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			StackIterator other = (StackIterator) obj;
			if (handler == null) {
				if (other.handler != null)
					return false;
			} else if (!handler.equals(other.handler))
				return false;
			if (restart == null) {
				if (other.restart != null)
					return false;
			} else if (!restart.equals(other.restart))
				return false;
			return true;
		}

	
	@Override
	public String toString() {
		return "StackIterator [handler=" + handler + ", restart=" + restart
				+ "]";
	}

	
}



